Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

MTU 与分片

复习

  • 路由表与最长前缀匹配:多条匹配时选更具体的一条
  • IPv4 数据包:首部含长度与 TTL 等字段
  • 子网与 CIDR:网络用前缀划分范围

TL;DR

  • 每条链路能承载的帧有大小上限,这个上限叫 MTU
  • 数据包比 MTU 大时,需要拆成若干分片
  • 分片会增加开销,而且丢一片就要重传整包
  • 更理想的做法是探测路径 MTU,尽量避免分片

正文

  数据包要坐“帧”这趟车穿过各条链路。可不同的链路,能装下的帧大小并不一样。如果包太大,塞不进这一跳的帧,怎么办?

每条路都有个“限高”

  每条链路能承载的最大数据量,叫作 MTU(最大传输单元,Maximum Transmission Unit)。

  这就像过隧道前的限高牌:车太高,就过不去。不同链路(以太网、无线、各种广域网)限高各不相同,一个包在网络里传,可能要经过限高更低的某一段。

拆开来过

  包比 MTU 大时,解决办法是分片(fragmentation):把原始数据拆成几块,每块加上自己的首部,分别装进独立的帧发出去。到了目的地,再由接收方把这些分片重组成原来的包。

  注意,重组通常只在最终目的地进行,中途的路由器不会去拼装——这样每台路由器都能轻装上阵。

  但分片是有代价的:

  • 每个分片都要额外带一份首部,开销变大
  • 只要任何一个分片丢失,整个包都无法重组,必须全部重传

  所以分片不是免费的午餐,它是“过大不得不拆”时的补救。

能不分,就不分

  既然分片这么麻烦,现代网络更倾向于避免分片

  一种办法是路径 MTU 发现:发送方先试探这条路上最小的 MTU 是多少,然后主动把包限制在这个大小以内,从源头上就不需要拆。

  这背后的思路很值得记住:与其让问题在半路临时爆发,不如提前摸清限制、主动适应。 这也是很多协议设计的共同智慧。

  当然,包在路上还可能遇到别的麻烦:到不了、绕太久。网络用什么方式把这些情况告诉发送方?下一章揭晓。

思考题 1

  为什么分片之后,只要丢失一个分片,整个包都要重传?

思考题 2

  为什么更希望“避免分片”,而不是“经常分片”?

小结

知识点

  • MTU 是一条链路能承载的最大传输单元
  • 包过大时分片,在目的地重组
  • 分片增加开销,且丢一片就要重传整包
  • 路径 MTU 发现可避免分片

参考资料

  1. Wikipedia(zh):最大传输单元:链路可承载的最大数据量
  2. Wikipedia(zh):IP分片:把过大的数据包拆成若干片段

思考题答案(仅供参考)

思考题 1

  因为接收方只有收齐全部分片,才能拼回原来的完整数据包。少了任何一片,拼装就无法完成,只能等待重传。所以一个分片丢失,代价等同于整包丢失。

思考题 2

  因为分片会带来额外首部开销,并显著放大丢包的代价(丢一片等于丢整包)。避免分片能让每个包以合适的大小上路,减少开销与重传风险,整体效率更高。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

![](https://raw.githubusercontent.com/TinySnow/computer-science-guide-resources/master/computer-science-guide/cover/计算机网络/MTU 与分片.png)

设计师 | 南国微雪